iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
生成式 AI

阿,又是一個RAG系列 第 22

Day21: Evaluating the correctness evaluator

  • 分享至 

  • xImage
  •  

Situation

  • 我們昨天 Day20: Structured Output 初驗!五大選手比拚結果 使用 normalized_exact_match 初驗了各選手的結果
  • 我們在 Day19: evaluator in llama-index 探索了三種基於模型的驗證方法
    • Semantic Similarity Evaluator: 驗證 responsereference_answer 的相似性
    • Correctness Evaluator: 給定 query, responsereference_answer,要求 llm 判斷答案正確性
    • Faithfulness Evaluator: 給定 responsereference_context,要求 llm 判斷 response 是否有忠於 reference_context
  • 我們今天來實測看看 Correctness Evaluator 靠不靠譜吧!
  • 註:如果你第一次點進來,建議先從 Day16: Pydantic 與 Structured Output 開始

Task

  • 今天的任務主要有 3 件事:
      1. 使用 Correctness Evaluator 驗證 2_llama_zh 的預測結果
      1. 把 Correctness Evaluator 驗證的結果 與 昨天 normalized exact match 的結果進行比較
      1. 提升 Correctness Evaluator: 藉由我們上一步的觀察,以及調整 Prompt

那我們就開始吧!

Action

1. 資料準備:

  • days/day21/data/source 路徑下:
    • evaluation_dataset 存放的是先前準備好給 evalautor 當 input 的資料集
      • 一個檔案是一個 model 的 predict 結果.
      • 每個檔案內都是 list of dictionary
      • 每個 dictionary 包含 keys: [reference_answer, reference_context, response]
    • normalized_exact_match_result 存放的是昨天使用 normalized_exact_match 跑出來的結果
      • 一個檔案是針對一個 model 的驗證結果.
      • 每個檔案內都是 list of dictionary
      • 每個 dictionary 包含 keys: [qid, ispass, label, pred, nlabel, npred]
  • 我們的流程包含:
    • 從 evaluation_dataset 讀取資料 -> 執行 correctness 的驗證 -> 把結果存到獨立的資料夾
    • 讀取 normalized_exact_match 的結果 -> 讀取對應 correctness 的結果 -> 查看針對預測相同與不同的驗證結果
      • 為了在取得 normalized_exam_match 的結果之後,可以順利的取到對應的 correctness 結果,也為了在有 qid 之後,我們會針對性的檢視 evaluator 的結果,我們把 correctness 的 output 改為存放以 qid 為 key,dictionary 為 value 的格式

2. 執行 CorrectnessEvaluator.py

  • 我們使用 gpt-5-mini 作為 CorrectnessEvaluator 的 llm
  • CorrectnessEvaluator 的 input 有 3 個:
    • query:
      • 當初要求 llm 執行的任務,包含要求提取的原始文本
        • 這邊可以確實描述任務即可,不一定需要原始的 prompt
    • reference(answer):
      • (相對)正確的答案
        • 比如在有些 case 下可以放 gpt 的答案
        • 我們這邊是放使用 regex 提取的答案
    • response:
      • 待驗證的模型 respose
  • CorrectnessEvaluator 依據 default prompt 的要求會輸出:
    • 一個 0-5 的 score,越高越對
    • 一個 feedback 描述為什麼這樣評分
  • 我們的範例輸出結果在:這裡

3. 與 normalized exact match 的比較

  • 這邊要先說明一下,我們昨天在使用 exact match 評估的時候,只有比較 題幹 的部分

  • 我們今天直接評估整個單選題的結果,因此預期是 correctness evaluator 會抓出比 exact match 更多的 錯誤結果

  • 此外,由於 correctness 整體的評分結果是從滿分(5分)開始,一個瑕疵就給 4 分,兩個瑕疵就給 3分依此類推

    • 除非是重大瑕疵會直接給到最低分 1 分
    • 由於我們是提取的任務,有一點小瑕疵對我們來說可能就是重大瑕疵,因此我們拉高了 threshold ,只要 correctness 沒有給出滿分 5 分,這題我們就算沒有 pass
      • 同時這也反映了我們最初的觀察,除分是重大瑕疵,否則 llm 的評價偏向給高分
  • 整體來說,在 80 題的評估內,

    • correctness evaluator 與 normalized exact match 一致的有 69
    • 人工評估後,有 6 題是 correctness 額外抓出了除了題幹以外的提取問題,不應算錯
      • 包含題幹對,選項錯
      • 或者是類似把選項額外提取了 ABCD 等字
    • 有 4 題是 False Negative,應該判定為有問題,而 correctness 判定為無問題
      • 但部分 feedback 有講出問題(qid提取錯),但是他覺得無所謂所以還是給 5 分
        • 這個問題也許可以靠 prompt 修正
    • 以準確率來判定的話, correctness evaluator 有 0.9375 的準確率在我們的問題集上
  • 詳細結果在: 這裡

4. prompt_correctness_evaluator

  • 由於前述提到,correctness 基本上是直接 prompt llm 進行驗證

  • 而根據我們先前的經驗,直接將 default prompt 翻譯為中文並且微幅修改可以增加整體的準確性

  • 因此我們修改了 default prompt 再進行一次驗證

    • 修改後的 prompt 在 這裡
  • 調整 correctness_evaluator prompt 的方法是: 直接在 initial 的時候把 prompt 給他:

    • correct_evaluator = CorrectnessEvaluator(llm = llm, score_threshold=4.0, eval_template=chat_template)
  • 並且可以使用 get_prompts 查看是否成功更新:

    • correct_evaluator.get_prompts()
  • prompt_correctness_evaluator 的 結果在: 這裡

5. prompt_correctness_evaluator 與 normalized exact match 的比較

  • 80 題的測試中:
    • 有 3 題的 False Positive,有辦法在修改後除去這些錯誤
      • 主要是 llm 因 prompt 而產生的瑕疵,包含:
        • 先給 option 才給 stem 被 llm 判錯
        • qid 給 int 但答案是 string 被 llm 判錯
        • ans 給 none 被 llm 判錯 (llm 認為應該直接不要給)
    • 有 1 題的 False Negative:
      • 在 stem 中同時提取了選項沒有被發現
    • 以準確率來判定的話, prompt_correctness_evaluator 有 0.95 的準確率在我們的問題集上
      • 但這其中只有 1 題是真的本質上的判斷錯誤

Summary:

  • 我們今天實際比較了 Correctness Evaluator 與 normalized_exact_match 的結果
    • 在我們的 toy problem 上,Correctness Evaluator 預設初始結果有 93 % 的準確率
  • 我們進一步的藉由客製 prompt 想要提升這個結果
    • 由於修改為中文 prompt 的關係,預設的 feedback 也變成了中文
      • 這對中文母語開發者是一個相當重要的特性
    • 我們藉由拉高 threshold 想要做到 Recall 100 %
      • 但是最終仍有 1 題其實有錯但卻通過了驗證
    • 最終的 evaluator 的準確率達到 95 %
      • 但裡面只有 1 題是真正繞不開的錯誤
  • 整體而言使用 llm 針對結果進行驗證
    • 雖然有一定的準確率,但也不能保證把所有錯誤都抓出來
    • 但若是以更了解我們的預測結果作為目的來說
      • llm 自帶的 feedback 功能可以提供相當多的參考
        • 比如以今天的實測來說,它提供了很多原本根本沒想到的問題
  • 我們明天來評估看看 Semantic Similarity Evaluator 的結果

上一篇
Day20: Structured Output 初驗!五大選手比拚結果
下一篇
Day22: Evaluating Semantic Similarity and P-R Curve
系列文
阿,又是一個RAG24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言